#ifndef MUSIC_H
#define MUSIC_H

#include <QWidget>
#include <QJsonArray>
#include <QDir>
#include <QFileDialog>
#include <QSet>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPropertyAnimation>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QMessageBox>
#include <QSystemTrayIcon>
#include <QMenu>

#include "recbox.h"
#include "volumetool.h"
#include "musiclist.h"
#include "commonpage.h"
#include "lrcpage.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Music; }
QT_END_NAMESPACE

class Music : public QWidget
{
    Q_OBJECT

public:
    Music(QWidget *parent = nullptr);
    ~Music();

    void initUI();  //初始化

    void initPlayer();// 初始化媒体对象

    void connectSignalAndSlot();    //关联信号槽

    void setMusicSilence(bool isMuted);         //设置静音

    void setPlayerVolume(int Volume);           // 设置⾳量⼤⼩

    QJsonArray RandomPicture();     //电台图片

    void initSqlite();              //初始化数据库

    void initMusicList();           //初始化音乐列表

    void quitMusic();               //退出程序


private slots:
    void on_quit_clicked();     //退出

    void on_volume_clicked();   //音量

    void onBtFormClick(int id);     //听歌模式选项

    void on_addlocal_clicked(); //添加本地音乐

    void on_play_clicked();     //播放按钮

    void on_playpre_clicked();  //上一首

    void on_playnext_clicked(); //下一首

    void onUpdateLikeMuisc(bool isLike,QString musicId);    // 响应CommonPage发射updateLikeMusic信号

    void onPlayStateChanged();      //改变播放按钮图标,QMediaPlayer发送信号stateChanged

    void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbackMode);  //播放模式设置改变

    void on_playmode_clicked();     //播放模式按钮

    void onPlayAll(PageType pageType);  //播放全部

    void playMusicByIndex(CommonPage* page,int index);  //播放歌曲

    void onCurrentIndexChanged(int index);      // ⽀持播放历史记录

    void onDurationChanged(qint64 duration);    // 歌曲持续时⻓改变时[歌曲切换]

    void onPositionChanged(qint64 position);    // 播放位置改变，即持续播放时间改变

    void onMusicSliderChanged(float value);     // 进度条改变

    void onMetaDataAvailableChangedChanged(bool available);     //歌曲改变信息


    //测试SQLite部分
    void on_testSQL_clicked();

    void on_createtb_clicked();

    void on_insert_clicked();

    void on_select_clicked();

    void on_update_clicked();

    void on_del_clicked();

    void on_skin_clicked();

    void on_min_clicked();

private:
    // 重写QWidget类的⿏标单击和⿏标滑动事件
    void mouseMoveEvent(QMouseEvent *event);

    void mousePressEvent(QMouseEvent *event);

    void playAllOfCommonPage(CommonPage* commonPage,int index);


private:
    Ui::Music *ui;
    QPoint dragPosition;    // 记录光标相对于窗⼝标题栏的相对距离
    VolumeTool* volumeTool; //音量控制模块
    MusicList musicList;   // 程序用来组织歌曲文件
    LrcPage* lrcPage;       //歌曲页面
    QPropertyAnimation* lrcAnimation;   //歌曲页面动画

    //播放器相关
    QMediaPlayer* player;   // 专门用来播放控制
    QMediaPlaylist* playList;   // 专门用来管理播放源，包含一些播放模式设置等

    CommonPage* currentPage;
    int currentIndex;         // 记录当前正在播放歌曲在媒体列表中的索引

    qint64 totalTime;         // 记录媒体源的总时间

    QSqlDatabase sqlite;        //持久化数据库

    bool isDrag; // 为true时候窗⼝才能拖拽
};
#endif // MUSIC_H
